package com.aviatorscript.aviatorscript.entity;

import com.baomidou.mybatisplus.annotation.*;
import lombok.Data;
import lombok.EqualsAndHashCode;

import java.time.LocalDateTime;

/**
 * 字段映射规则表实体类
 * 用于存储具体的字段映射关系和转换脚本
 */
@Data
@EqualsAndHashCode(callSuper = false)
@TableName("field_mapping_rule")
public class FieldMappingRule {

    /**
     * 主键ID - 自增长
     */
    @TableId(value = "id", type = IdType.AUTO)
    private Long id;

    /**
     * 转换规则ID - 关联transform_rule表
     */
    @TableField("rule_id")
    private Long ruleId;

    /**
     * 源字段路径 - 支持嵌套字段，如：user.name、address.city
     */
    @TableField("source_field_path")
    private String sourceFieldPath;

    /**
     * 目标字段路径 - 支持嵌套字段，如：userInfo.userName
     */
    @TableField("target_field_path")
    private String targetFieldPath;

    /**
     * 源字段类型 - 用于类型校验和转换
     */
    @TableField("source_field_type")
    private String sourceFieldType;

    /**
     * 目标字段类型 - 用于类型校验和转换
     */
    @TableField("target_field_type")
    private String targetFieldType;

    /**
     * 映射类型枚举
     * DIRECT: 直接映射，字段名可能不同但值直接复制
     * SCRIPT: 脚本转换，使用AviatorScript进行复杂转换
     * CONSTANT: 常量值，固定值赋值
     * FUNCTION: 函数转换，调用预定义函数
     */
    @TableField("mapping_type")
    private String mappingType;

    /**
     * AviatorScript转换脚本 - 当mappingType为SCRIPT时使用
     * 脚本中可以使用source变量引用源对象
     */
    @TableField("transform_script")
    private String transformScript;

    /**
     * 常量值 - 当mappingType为CONSTANT时使用
     */
    @TableField("constant_value")
    private String constantValue;

    /**
     * 默认值 - 当源字段为null或空时使用的默认值
     */
    @TableField("default_value")
    private String defaultValue;

    /**
     * 是否必填 - 1:必填字段（源字段为null时抛异常），0:非必填
     */
    @TableField("required")
    private Boolean required;

    /**
     * 排序顺序 - 控制字段映射的执行顺序，数字越小优先级越高
     */
    @TableField("sort_order")
    private Integer sortOrder;

    /**
     * 是否启用 - 1:启用，0:禁用
     */
    @TableField("enabled")
    private Boolean enabled;

    /**
     * 备注说明 - 用于描述映射逻辑或特殊处理
     */
    @TableField("remark")
    private String remark;

    /**
     * 创建时间 - 自动填充
     */
    @TableField(value = "create_time", fill = FieldFill.INSERT)
    private LocalDateTime createTime;

    /**
     * 更新时间 - 自动填充
     */
    @TableField(value = "update_time", fill = FieldFill.INSERT_UPDATE)
    private LocalDateTime updateTime;

    /**
     * 映射类型常量定义
     */
    public static class MappingType {
        /** 直接映射 */
        public static final String DIRECT = "DIRECT";
        /** 脚本转换 */
        public static final String SCRIPT = "SCRIPT";
        /** 常量值 */
        public static final String CONSTANT = "CONSTANT";
        /** 函数转换 */
        public static final String FUNCTION = "FUNCTION";
    }
} 